home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.io.PrintStream;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import sun.tools.asm.Assembler;
- import sun.tools.asm.CatchData;
- import sun.tools.asm.TryData;
- import sun.tools.java.ClassDeclaration;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.Type;
-
- public class TryStatement extends Statement {
- Statement body;
- Statement[] args;
-
- public TryStatement(int var1, Statement var2, Statement[] var3) {
- super(101, var1);
- this.body = var2;
- this.args = var3;
- }
-
- long check(Environment var1, Context var2, long var3, Hashtable var5) {
- try {
- var3 = ((Statement)this).reach(var1, var3);
- Hashtable var6 = new Hashtable();
- CheckContext var7 = new CheckContext(var2, this);
- long var8 = this.body.check(var1, var7, var3, var6);
-
- for(int var10 = 0; var10 < this.args.length; ++var10) {
- var8 &= this.args[var10].check(var1, var7, var3, var5);
- }
-
- for(int var11 = 1; var11 < this.args.length; ++var11) {
- CatchStatement var12 = (CatchStatement)this.args[var11];
- if (var12.field != null) {
- Type var13 = var12.field.getType();
- ClassDefinition var14 = var1.getClassDefinition(var13);
-
- for(int var15 = 0; var15 < var11; ++var15) {
- CatchStatement var16 = (CatchStatement)this.args[var15];
- if (var16.field != null) {
- Type var17 = var16.field.getType();
- ClassDeclaration var18 = var1.getClassDeclaration(var17);
- if (var14.subClassOf(var1, var18)) {
- var1.error(this.args[var11].where, "catch.not.reached");
- break;
- }
- }
- }
- }
- }
-
- ClassDeclaration var24 = var1.getClassDeclaration(Constants.idJavaLangError);
- ClassDeclaration var25 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
-
- for(int var26 = 0; var26 < this.args.length; ++var26) {
- CatchStatement var27 = (CatchStatement)this.args[var26];
- if (var27.field != null) {
- Type var29 = var27.field.getType();
- if (var29.isType(10)) {
- ClassDefinition var31 = var1.getClassDefinition(var29);
- if (!var31.subClassOf(var1, var24) && !var31.superClassOf(var1, var24) && !var31.subClassOf(var1, var25) && !var31.superClassOf(var1, var25)) {
- boolean var33 = false;
- Enumeration var19 = var6.keys();
-
- while(var19.hasMoreElements()) {
- ClassDeclaration var20 = (ClassDeclaration)var19.nextElement();
- if (var31.superClassOf(var1, var20) || var31.subClassOf(var1, var20)) {
- var33 = true;
- break;
- }
- }
-
- if (!var33) {
- var1.error(var27.where, "catch.not.thrown", var31.getName());
- }
- }
- }
- }
- }
-
- Enumeration var28 = var6.keys();
-
- while(var28.hasMoreElements()) {
- ClassDeclaration var30 = (ClassDeclaration)var28.nextElement();
- ClassDefinition var32 = var30.getClassDefinition(var1);
- boolean var34 = true;
-
- for(int var35 = 0; var35 < this.args.length; ++var35) {
- CatchStatement var36 = (CatchStatement)this.args[var35];
- if (var36.field != null) {
- Type var21 = var36.field.getType();
- if (!var21.isType(13) && var32.subClassOf(var1, var1.getClassDeclaration(var21))) {
- var34 = false;
- break;
- }
- }
- }
-
- if (var34) {
- var5.put(var30, var6.get(var30));
- }
- }
-
- return var2.removeAdditionalVars(var8 & var7.vsBreak);
- } catch (ClassNotFound var22) {
- var1.error(super.where, "class.not.found", var22.name, Constants.opNames[super.op]);
- return var3;
- }
- }
-
- public Statement inline(Environment var1, Context var2) {
- if (this.body != null) {
- this.body = this.body.inline(var1, new Context(var2, this));
- }
-
- if (this.body == null) {
- return null;
- } else {
- for(int var3 = 0; var3 < this.args.length; ++var3) {
- if (this.args[var3] != null) {
- this.args[var3] = this.args[var3].inline(var1, new Context(var2, this));
- }
- }
-
- if (this.args.length == 0) {
- return ((Statement)this).eliminate(var1, this.body);
- } else {
- return this;
- }
- }
- }
-
- public Statement copyInline(Context var1, boolean var2) {
- throw new CompilerError("copyInline");
- }
-
- public void code(Environment var1, Context var2, Assembler var3) {
- CodeContext var4 = new CodeContext(var2, this);
- TryData var5 = new TryData();
-
- for(int var6 = 0; var6 < this.args.length; ++var6) {
- Type var7 = ((CatchStatement)this.args[var6]).field.getType();
- if (var7.isType(10)) {
- var5.add(var1.getClassDeclaration(var7));
- } else {
- var5.add(var7);
- }
- }
-
- var3.add(super.where, -3, var5);
- if (this.body != null) {
- this.body.code(var1, var4, var3);
- }
-
- var3.add(var5.getEndLabel());
- var3.add(super.where, 167, var4.breakLabel);
-
- for(int var9 = 0; var9 < this.args.length; ++var9) {
- CatchData var8 = var5.getCatch(var9);
- var3.add(var8.getLabel());
- this.args[var9].code(var1, var4, var3);
- var3.add(super.where, 167, var4.breakLabel);
- }
-
- var3.add(var4.breakLabel);
- }
-
- public void print(PrintStream var1, int var2) {
- super.print(var1, var2);
- var1.print("try ");
- if (this.body != null) {
- this.body.print(var1, var2);
- } else {
- var1.print("<empty>");
- }
-
- for(int var3 = 0; var3 < this.args.length; ++var3) {
- var1.print(" ");
- this.args[var3].print(var1, var2);
- }
-
- }
- }
-